/**
 * 用于记录当前活动的 effect
 */
export let activeEffect = undefined
export const targetMap = new WeakMap() // 用来存储对象和其属性的依赖关系
const effectStack = [] // 模拟函数的调用栈

/**
 * 该函数的作用，是执行传入的函数，并且在执行的过程中，收集依赖
 * @param {*} fn 要执行的行数
 * @param {*} options 配置选项
 */
export function effect(fn, options = {}) {
  const { lazy = false } = options
  const environment = () => {
    try {
      activeEffect = environment
      effectStack.push(environment)
      cleanup(environment)
      return fn()
    } finally {
      effectStack.pop()
      activeEffect = effectStack[effectStack.lengt - 1]
    }
  }
  environment.deps = []
  environment.options = options
  if (!lazy) {
    environment()
  }
  return environment
}

export function cleanup(environment) {
  let deps = environment.deps // 拿到当前环境函数的依赖（是个数组）里面保存的是集合的引用
  if (deps.length) {
    deps.forEach((dep) => {
      dep.delete(environment)
    })
    deps.length = 0
  }
}
